2010-11-16 98 views
2

我正在嘗試重新設計一個最初使用Raptier構建的數據訪問層。 Raptier生成接受一個where子句作爲參數傳入存儲過程的方法。我真的需要保留現有的mesthos簽名,所以我的新DAL需要接受where子句。我想使用更新的數據訪問技術和技術,所以想要使用.Net 4.0中的實體框架。在實體框架中使用動態where子句

但是,它看起來並不像我可以接受動態where子句而沒有執行一些強烈的reoutines來將它們解析成lamba表達式。有什麼我錯過了嗎?我與Entity Framework的運氣不佳嗎?

感謝, 馬克

+3

也許你應該給我們看一些代碼。我不認爲很多人知道Raptier stuf是怎麼樣的。 – Steven 2010-11-16 19:55:59

回答

7

想到兩個想法。

1)。 Dynamic LINQ,它允許您定義運算符作爲字符串的位置。

var result = Northwind.Products 
    .Where("CategoryId=2 And UnitPrice>3") 
    .OrderBy("SupplierId"); 

2)。使用的東西作爲EntityFilter<T>(見代碼here),它允許你定義這樣的過濾器:

IEntityFilter<Person> entityFilter = 
    from person in EntityFilter<Person>.AsQueryable() 
    where person.Name.StartsWith("a") 
    where person.Id < 100 
    select person; 

您可以提供IEntityFilter<Person>的業務方法,將能夠以過濾查詢:

public static Person[] GetAllPersons(
    IEntityFilter<Person> filter) 
{ 
    using (var db = ContextFactory.CreateContext()) 
    { 
     IQueryable<Person> filteredList = 
      filter.Filter(db.Persons); 

     return filteredList.ToArray(); 
    } 
} 
+1

史蒂文的選擇1看起來最接近我們現在正在做的事情。這可能工作!非常感謝您的回覆! – MCalder 2010-11-17 19:10:06

+0

動態LINQ看起來非常整齊。 – 2012-10-23 04:01:58

0

看看這裏裏克施特拉爾的博客文章:http://www.west-wind.com/weblog/posts/160237.aspx。他的演示使用Linq to SQL,但在EF中並沒有太大差別。這種方法涉及將IQueryable展示給業務層。這不是沒有爭議,但需要考慮。

隨着IQueryable的公開,您可以針對返回的集合編寫LINQ查詢。我不保證你能夠使它與sprocs一起工作,但試試看。

0

面對同樣的問題,,現在raptier停產可能是,,以及因此

我有一個線索,,因爲我使用精簡版的版本僅支持15表/視圖.. 這裏是一個捷徑, ,

總是在服務器中的虛擬測試數據庫,,並生成你想要的課程,然後用你的類庫的解決方案進行合併,重新生成解決方案,並像移動到你想要的程度,,

其費力,但它的工作。

需要更多的幫助,,很高興...

相關問題