开发者

LINQ - Contains with anonymous type

开发者 https://www.devze.com 2022-12-23 12:15 出处:网络
When using this code (simplified for asking): var rows1开发者_如何学编程 = (from t1 in db.TABLE1

When using this code (simplified for asking):

var rows1开发者_如何学编程 = (from t1 in db.TABLE1
    where (t1.COLUMN_A == 1)
    select new { t1.COLUMN_B, t1.COLUMN_C });

var rows2 = (from t2 in db.TABLE2
    where (rows1.Contains(t2.COLUMN_A))
    select t2;

I got the following error:

The type arguments for method 'System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable, TSource)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

I need to filter the first result by COLUMN_B, but I don't know how. Is there a way to filter it?


In order to use Contains you must pass an instance of the type in the IEnumerable<T>. This is exceedingly hard with anonymous types.

Instead I would use the Any extension method overload which allows you to specify a comparison lambda. For example

var rows2 = (from t2 in db.TABLE2
    where (rows1.Any(x => x.COLUMN_B == t2.COLUMN_A))
    select t2;


Try using Any

var rows1 = (from t1 in db.TABLE1
    where (t1.COLUMN_A == 1)
    select new { t1.COLUMN_B, t1.COLUMN_C });

var rows2 = (from t2 in db.TABLE2
    where (rows1.Any( r => r.COLUMN_B == t2.COLUMN_A))
    select t2;


does this works?

var rows1 = (from t1 in db.TABLE1
    where (t1.COLUMN_A == 1)
    select new { t1.COLUMN_B, t1.COLUMN_C }).ToList();

var rows2 = (from t2 in db.TABLE2
    where (rows1.Contains(t2.COLUMN_A))
    select t2;
0

精彩评论

暂无评论...
验证码 换一张
取 消