使用linq在查询中动态选择

时间:2013-12-04 12:24:53

标签: linq linq-to-sql dynamic-linq

我在下面的链接中看到了动态linq: ScottGu

我想使用此方法选择这样的动态查询:

我有一个复杂的选择,这种方式无法解决我的问题, 这是我的选择:

Select sUserName,sname, sFamily,sMobail,sid,sNumberSt,sActive,sPic,sDate from Student where {0} order by sid desc";

{0}是一个复杂的条件:

sname like %somthing% and susername=N'something' and sid in (select sidfk from tablex where userteacher=N'name1')

并将此条件传递给方法。 我必须说: 我不知道我的情况,我的条件是用户搜索params指定的。这个条件我说,这只是我想要做的一个例子。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

解决我问题的唯一方法:

我发送两个参数而不是一个参数,一个用于学生,一个用于tablex:

var az = db.tablex.Where(p => p.userteacher== name1)
            .Select(p => p.sidfk).ToList();
        var query = db.Students.Where(textSearch).Where(s=>az.Contains(s.sid)).OrderByDescending(s => s.sid)
            .Select(s => new
            {
               s.sUserName,
                s.sname,
                s.sFamily,
                s.sMobail,
                s.sid,
                s.sNumberSt,
                s.sActive,
                s.sPic,
                s.sDate,
            });

wiche textSearch是:

sname like %somthing% and susername=N'something'

使用动态linq

是否存在更好的方式?

答案 1 :(得分:0)

在这种情况下,您无需使用动态linq。

string paramA = "", paramB = "";

var query = from x in context.table1
            where x.name == paramA
            where context.table2.Where(y => y.field1 == paramB).Any(y => y.id == x.id)
            select x;

答案 2 :(得分:0)

动态Linq通常在查询中使用if你不知道将使用哪个字段,所以在你的样本中你只使用params作为字段的条件,所以你不需要动态linq

你可以很少优化你这样的查询

var query = from student in db.Students
            join teacher in db.tablex on student.sid equals teacher.sidfk
            where student.sname.Contains('somthing') && 
                  susername=='something' &&
                  teacher.userteacher=='name1'
            orderby s.sid descending 
            select new
                {
                    s.sUserName,
                    s.sname,
                    s.sFamily,
                    s.sMobail,
                    s.sid,
                    s.sNumberSt,
                    s.sActive,
                    s.sPic,
                    s.sDate,
               };