2012-02-24 83 views
5

我正在動態構建LINQ語句。我正在構建的LINQ語句純粹用於WHERE子句。動態LINQ - 無法在GUID和字符串之間轉換

string[] values = GetPropertyValues(); 
string propertyName = GetPropertyName(); 

string clause = string.Empty; 
if (values.Length > 0) 
    clause = propertyName + "==\"" + values[0] + "\""; 

從我所知道的,我的LINQ查詢看起來是正確的。但是,當它被執行,我收到一個錯誤,指出:「?的Guid」

操作「==」與操作數類型不兼容和「字符串」

我該如何解決這個問題?

謝謝!

+0

看看這裏:http://weblogs.asp.net/ scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – 2012-02-24 19:23:19

+0

您是否會提供值和propertyName的示例數據? – 2012-02-24 20:04:05

回答

0

聽起來像GetPropertyName()返回的屬性的類型爲Guid(我從錯誤中猜出),但是您試圖將它與您聲明爲字符串的值[0]的內容進行比較。

動態LINQ的讓你的WHERE子句中定義參數,所以你可以做

string clause = propertyName + "= @1"; 
LambdaExpression expr = Dynamic.ParseLambda(typeof(YourType), typeof(bool), clause, values[0]); 

其中YourType是該項目的源IQueryable類型。因此,例如,如果您的源查詢是IQueyable<Customer>,那麼YourType將是Customer。無論propertyName所示的屬性類型是什麼,這都可以工作。

當它進行解析時,Dynamic Linq會指出lambda表達式的類型參數應使用YourTypepropertyName上的反射。你得到的lambda表達式就是你應該用作.Where()擴展方法的參數。

+1

+1這是正確的答案(儘管值得一提的是'Where'擴展方法也支持命名參數,所以不需要調用這個靜態方法)。 OP在做什麼和這個(我想指出)之間的實際區別在於* value *在這種情況下不必再是字符串;它可以是一個實際的Guid實例。在這種情況下,'GetPropertyValues()'將需要返回實際值,而不是它們的字符串表示。 – Groo 2012-02-24 21:21:19

+0

非常正確。 GetPropertyValues需要是object []類型而不是string []。 – 2012-02-24 21:49:41

3

對於一個空值,像這樣的工作:

,但它顯然是一個相當特殊的情況。

PredicateBuilder通過阿爾巴哈利可能是一個更好的解決方案完全。

+0

也許GetPropertyName()返回一個非字符串對象。所以我想它應該是字符串propertyName = GetPropertyName()。ToString(); – 2012-02-24 20:15:22

+0

@Love:我認爲它實際上以字符串形式(例如'「Id」')返回屬性名稱。基本上,你需要構建一個動態的where子句(將某個屬性的值與不同的值進行比較)。但是當動態LINQ編譯表達式時,它不能將'Id'(這是一個'Nullable ')的值與'String'進行比較。 – Groo 2012-02-24 20:24:14

+1

你剛剛救了我的一天。我現在可以和我的孩子一起去野餐:D – 2016-10-30 13:27:25

5

對於動態linq使用查詢屬性和Equals()方法中的GUID比較,就像在提供的示例中一樣。

var items = new[] 
      { 
       new { Id = Guid.Empty }, 
       new { Id = Guid.NewGuid() }, 
       new { Id = Guid.NewGuid() } 
      }; 

var result = items.AsQueryable() 
    .Where("Id.Equals(@0)", Guid.Empty) 
    .Any(); 
0

如果你不想通過GUID作爲一個參數,你可以使用字符串和GUID的比較:

clause = "Id.Value.Equals(Guid(\"" + values[0] + "\"))"; 

也就是說作品。

...或者是在你的榜樣:

clause = propertyName + ".Value.Equals(\"" + values[0] + "\")"; 
5

對我的作品不帶參數

"Id.Equals(Guid(\"D243372F-7ED0-40E6-B93D-6165F7521C29\"))" 

隨着 「值」 是行不通的。錯誤apear

「{無屬性或字段 '值' 存在於型 '的Guid'(索引3)}」