我正在尝试使用linq-to-sql在应用程序中实现一个非常基本的关键字搜索.我的搜索词是一个字符串数组,每个数组项都是一个单词,我想找到包含搜索词的行.我不介意它们是否包含的不仅仅是搜索条件(最有可能的是它们),但所有搜索条件都必须存在.
理想情况下,我想要类似下面的代码片段,但我知道这不起作用.此外,我在这里看过这个问题,但是这个问题的作者似乎满足于反过来做事(query.Contains(part.partName)),这对我不起作用.
public IQueryable<Part> SearchForParts(string[] query)
{
return from part in db.Parts
where part.partName.Contains(query)
select part;
}
Run Code Online (Sandbox Code Playgroud)
如何重写此查询以便它能够满足我的需求?
我知道这可能是意见,但我正在寻找最佳实践.
据我所知,IQueryable<T>实现IEnumerable<T>,所以在我的DAL中,我目前有方法签名,如下所示:
IEnumerable<Product> GetProducts();
IEnumerable<Product> GetProductsByCategory(int cateogoryId);
Product GetProduct(int productId);
Run Code Online (Sandbox Code Playgroud)
我应该IQueryable<T>在这里使用吗?
这两种方法的优点和缺点是什么?
请注意,我打算使用Repository模式,所以我将有一个这样的类:
public class ProductRepository {
DBDataContext db = new DBDataContext(<!-- connection string -->);
public IEnumerable<Product> GetProductsNew(int daysOld) {
return db.GetProducts()
.Where(p => p.AddedDateTime > DateTime.Now.AddDays(-daysOld ));
}
}
Run Code Online (Sandbox Code Playgroud)
我应该改变我IEnumerable<T>的IQueryable<T>吗?一个或另一个有哪些优点/缺点?
我们发现我们为C#/ C++代码编写的单元测试确实得到了回报.但是,我们仍然在存储过程中拥有数千行业务逻辑,当我们的产品推广到大量用户时,它们才真正得到了真正的测试.
更糟糕的是,这些存储过程中的一些最终会很长,因为在SP之间传递临时表时性能会受到影响.这阻止了我们重构以使代码更简单.
我们已经尝试围绕一些关键存储过程构建单元测试(主要是测试性能),但是发现为这些测试设置测试数据真的很难.例如,我们最终复制测试数据库.除此之外,测试最终对变化非常敏感,甚至是对存储过程的最小变化.或表需要对测试进行大量更改.因此,在由于这些数据库测试间歇性地失败而导致许多构建中断之后,我们只需将它们从构建过程中拉出来.
所以,我的问题的主要部分是:有没有人成功为他们的存储过程编写单元测试?
我的问题的第二部分是使用linq进行单元测试是否更容易?
我想的是,您可以简单地创建一组测试对象,并在"linq to objects"情况下测试您的linq代码,而不是必须设置测试数据表.(我对linq来说是全新的,所以不知道这是否会起作用)
我在理解这里的问题时遇到了一些麻烦.我有一些代码使用LINQ从数据库中提取记录,并将它们放入一个被转换为接口的对象中.看起来有点像这样:
public IEnumerable<ISomeObject> query()
{
return from a in dc.SomeTable
select new SomeObject
{
//Assign various members here
} as ISomeObject;
}
Run Code Online (Sandbox Code Playgroud)
当我测试它时,我将返回的IEnumerable放入一个名为results的变量中并运行以下行:
Assert.AreEqual(EXPECTED_COUNT, results.Count());
Run Code Online (Sandbox Code Playgroud)
运行它时,我得到一个System.Security.VerificationException:"操作可能会破坏运行时的稳定性."
我在这里找到了解决方案,这是:
var results = from a in dc.SomeTable
select new SomeObject
{
//Assign various members here
} as ISomeTable;
return results.OfType<ISomeObject>();
Run Code Online (Sandbox Code Playgroud)
这有效,但我无法理解这里发生的事情.为什么我首先得到异常,上面的代码行是如何解决的?MSDN文档似乎表明这是类型安全的问题,但我没有看到以前的代码类型不安全的地方.
更新 我发现的更多信息.如果我返回类型IQueryable,第一个示例有效.这揭示了一点点光什么是走错了,但我仍然感到困惑的原因.为什么编译器不强迫我将IEnumerable转换为IQueryable?
使用Linq命令和Linq To SQL datacontext,我试图以这种方式从我的datacontext实例化一个名为"Produccion"的实体:
Demo.View.Data.PRODUCCION pocoProduccion =
(
from m in db.MEDICOXPROMOTORs
join a in db.ATENCIONs on m.cmp equals a.cmp
join e in db.EXAMENXATENCIONs on a.numeroatencion equals e.numeroatencion
join c in db.CITAs on e.numerocita equals c.numerocita
where e.codigo == codigoExamenxAtencion
select new Demo.View.Data.PRODUCCION
{
cmp = a.cmp,
bonificacion = comi,
valorventa = precioEstudio,
codigoestudio = lblCodigoEstudio.Content.ToString(),
codigopaciente = Convert.ToInt32(lblCodigoPaciente.Content.ToString()),
codigoproduccion = Convert.ToInt32(lblNroInforme.Content.ToString()),
codigopromotor = m.codigopromotor,
fecha = Convert.ToDateTime(DateTime.Today.ToShortDateString()),
numeroinforme = Convert.ToInt32(lblNroInforme.Content.ToString()),
revisado = false,
codigozona = (c.codigozona.Value == null ? …Run Code Online (Sandbox Code Playgroud) 我正在为我的公司编写一个应用程序,目前正致力于搜索功能.当用户搜索项目时,我想显示最高版本(存储在数据库中).
问题是,版本存储为字符串而不是int,当我对结果执行OrderBy(q => q.Version)时,它们会像
1
10
11
2
3
...
Run Code Online (Sandbox Code Playgroud)
显然2在10之前.
有没有办法让我把版本转换为整数或者那里有一个简单的IComparer?到目前为止,我找不到任何实质内容.
我试过这样做:
var items = (from r in results
select r).OrderBy(q => Int32.Parse(q.Version));
Run Code Online (Sandbox Code Playgroud)
这编译但不起作用.
我正在从SQL迁移到Linq,我需要一些帮助.我正在测试Linq-to-SQL和Linq-to-Entities.我想尝试两者来决定哪一个最适合我.非常感谢您的帮助.谢谢
从表中选择最小日期值的正确语法(在vb.net中,如果可能)是什么?
Dim mydata As New DataClassesDataContext
Dim myresult = From cv In mydata.T1s
Select cv.DATE1, cv.Date2, cv.Datex
myresult=Dump()
Run Code Online (Sandbox Code Playgroud)
我试过试过用
Select amin=cv.DATE1.Min(), amax=cv.Date1.Max(), bmin=cv.Date2.Min(), etc....
Run Code Online (Sandbox Code Playgroud)
给出了这个错误'Min' is not a member of 'Date'.
我想要获得最小值和最大值的数据如下:
IOrderedQueryable<VB$AnonymousType_0<DateTime,DateTime>> (16 items)
Date1 Date2
17/Oct/09 12:00:00 AM 23/Oct/09 12:00:00 AM
10/Jan/09 12:00:00 AM 15/Feb/09 12:00:00 AM
27/Mar/09 12:00:00 AM 27/Mar/09 12:00:00 AM
30/May/09 12:00:00 AM 30/May/09 12:00:00 AM
25/Jan/09 12:00:00 AM 25/Mar/09 12:00:00 AM
01/Nov/09 12:00:00 AM 01/Nov/09 12:00:00 AM
21/Feb/09 12:00:00 AM 04/Mar/09 …Run Code Online (Sandbox Code Playgroud) 所以,我正在尝试返回一个人员集合,其ID包含在本地创建的ID集合中(IQueryable)
当我指定"本地创建的集合"时,我的意思是Ids集合不是来自LinqToSql查询,而是以编程方式创建(基于用户输入).我的查询如下所示:
var qry = from p in DBContext.People
where Ids.Contains(p.ID)
select p.ID;
Run Code Online (Sandbox Code Playgroud)
这导致以下异常......
"不支持使用本地集合的查询"
如何在本地创建的Ids集合中找到包含id的所有人员?
是否可以使用LinqToSql?
我正在尝试这样的查询......
query.Where(x => !string.IsNullOrEmpty(x.PropertyName));
Run Code Online (Sandbox Code Playgroud)
但它失败了......
所以现在我已经实现了以下功能......
query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty);
Run Code Online (Sandbox Code Playgroud)
有没有更好的(更本地?)方式LINQ处理这个?
编辑
道歉!没有包含提供程序......这是使用LINQ to SQL
我继承了一个没有完全优化设计的数据库,我需要操作一些数据.让我对我必须做的事情做一个更常见的比喻:
假设我们有一张Student桌子,一张StudentClass桌子记录了他参加的所有课程,还有一张StudentTeacher桌子可以存储教授这名学生的所有老师.是的,我知道这是一个愚蠢的设计,将老师存放在Class表上更有意义 - 但这就是我们正在使用的.
我现在想要清理数据,我想找到一个学生有老师但没有上课但是上课但没有老师的所有地方.SQL因此:
select *
from StudentClass sc
full outer join StudentTeacher st on st.StudentID = sc.StudentID
where st.id is null or sc.id is null
Run Code Online (Sandbox Code Playgroud)
你是怎么在Linq那样做的?
linq-to-sql ×10
linq ×5
c# ×4
.net ×1
.net-3.5 ×1
asp.net-mvc ×1
collections ×1
contains ×1
datacontext ×1
iqueryable ×1
outer-join ×1
sql ×1
sql-order-by ×1
unit-testing ×1