none
Linq2Entity中如何实现Linq2SQL中的SQLMethods.Like查询? RRS feed

  • 问题

  • public class Edb : DbContext{
        public Edb() : base("Name=ConnectionString"){}
        public DbSet<Product> Products{get;set;}
    }

    比如数据库中有以下数据:

    1. 东风145加油车(XXX立方)
    2. 东风153运油车(XXX立方)
    3. .....

    我想用LIKE查询“%东风%油车%",使用SQLMethods.LikeContains("东风%油车")都不行,有什么方法可以办到!



    • 已编辑 hbszsl 2013年11月13日 2:19
    2013年11月13日 2:13

答案

  • 已找到方法:

    var items=from a in db.products
      where System.Data.Entity.SqlServer.SqlFunctions.PatIndex("%东风%油车%")>0
    select a;

    • 已标记为答案 hbszsl 2013年12月5日 1:55
    • 取消答案标记 hbszsl 2013年12月5日 1:56
    • 已标记为答案 hbszsl 2013年12月5日 1:56
    2013年12月5日 1:55

全部回复

  • 楼主您好:

    我建议您使用where带条件查询:

    using(DataEntity entity = new DataEntity())
    {
        var result = from item in entity.XXX
                            where item.XXX.Contains("东风") && item.XXX.Contains("油车")
                           select item;
    }

    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    2013年11月13日 5:23
  • 你好 楼主,

    你的东方两个字是确保会在最前面的吗?

    如果是的话,建议你可以用

    where item.XXX.StartWith("东风") && item.XXX.Contains("油车")
    
    如果不是的就参照ThankfulHeart的就可以了。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年11月13日 6:22
    版主
  • 楼主,要不你还可以用正则表达式判断,比如:

    using (DataEntity entity = new DataEntity())
    {
         Regex reg = new Regex("东方.+?车");
         var result = from item in entity.XXX.AsEnumerable()
                             where reg.Match(item.XXX.ToString()).Successful
                             select item;
    }

    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    2013年11月13日 6:38
  • 如果是AsEnumerable()就是在内存中判断了。不是在数据库了。数据量大的话效率极低的
    2013年11月14日 2:13
  • 关键字是不确定的,有时甚至是更复杂的。所以我一开始就说不使用StartWith,EndWith,Contains

    有没有有办法扩展entityframework,让它支持like语句,如 like 'a%b%c%d%e'

    2013年11月14日 2:15
  • 我使用的是EF6,好像不能用  db.table.Where("....")这种方式查询。好像where后面只能是lambada表达式
    2013年11月14日 2:18
  • 尝试我的方法了吗?

    如果你用Lambda,完全可以:

    entity.XXX.AsEnumerable().Where(item=>reg.Match(item.XXX).Success);


    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    2013年11月14日 2:34
  • 使用AsEnumerable就是把数据全部读到内存中判断的,这样当然是可以!但是这样效率太低。几十万条数据,每条几十个字段

    尝试我的方法了吗?

    如果你用Lambda,完全可以:

    entity.XXX.AsEnumerable().Where(item=>reg.Match(item.XXX).Success);

    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com


    2013年11月14日 5:13
  • 您好,

    我知道那效率肯定很低,不过考虑到它不怎么支持DB,所以无奈用这个方法……

    要不你尝试是否写一个存储过程啥的,在里边调用?


    &lt;font size=&quot;1px&quot;&gt;For Account Validation, please follow &amp;quot;Verify Account&amp;#43;Number&amp;quot; at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug &lt;br/&gt; &lt;br/&gt; For ASP.NET Question, please ask at http://forums.asp.net &lt;br/&gt; &lt;br/&gt; For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites &lt;br/&gt; &lt;br/&gt; Click and Donate at http://www.freerice.com &lt;/font&gt;

    2013年11月14日 5:36
  • 您好,

    我知道那效率肯定很低,不过考虑到它不怎么支持DB,所以无奈用这个方法……

    要不你尝试是否写一个存储过程啥的,在里边调用?


    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report

    2013年11月14日 9:11
  • 已找到方法:

    var items=from a in db.products
      where System.Data.Entity.SqlServer.SqlFunctions.PatIndex("%东风%油车%")>0
    select a;

    • 已标记为答案 hbszsl 2013年12月5日 1:55
    • 取消答案标记 hbszsl 2013年12月5日 1:56
    • 已标记为答案 hbszsl 2013年12月5日 1:56
    2013年12月5日 1:55
  • 好的,谢谢分享你的答案,我的答案不是最好,请取消标记,谢谢!

    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report

    2013年12月5日 2:07