我正在创建一个创建一个搜索数据库的应用程序,并允许用户动态添加任何标准(大约50种可能),非常类似于以下SO问题:使用实体框架创建动态查询.我目前正在进行搜索,检查每个条件,如果它不是空白,则将其添加到查询中.
C#
var query = Db.Names.AsQueryable();
if (!string.IsNullOrWhiteSpace(first))
query = query.Where(q => q.first.Contains(first));
if (!string.IsNullOrWhiteSpace(last))
query = query.Where(q => q.last.Contains(last));
//.. around 50 additional criteria
return query.ToList();
Run Code Online (Sandbox Code Playgroud)
此代码在sql server中生成类似于以下内容的东西(为了便于理解,我进行了简化)
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
AND [LastName] LIKE '%last%'
Run Code Online (Sandbox Code Playgroud)
我现在尝试添加一种方法,通过实体框架使用C#生成以下SQL,但使用OR而不是AND,同时仍然保持动态添加条件的能力.
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
OR [LastName] LIKE '%last%' <-- NOTICE THE "OR"
Run Code Online (Sandbox Code Playgroud)
通常,条件不会大于查询的两个或三个项目,但将它们组合成一个巨大的查询不是一种选择.我尝试过concat,union和intersect,他们只是复制查询并将它们与UNION连接起来.
是否有一种简单而干净的方法可以使用实体框架向动态生成的查询添加"OR"条件?
使用我的解决方案进行编辑 - 2015年9月29日
自发布以来,我注意到这已经得到了一点关注,所以我决定发布我的解决方案
// Make …
Run Code Online (Sandbox Code Playgroud) 我试图使用autofixture来创建一个对象,但它们是我想要始终默认的某些属性(其余的可以自动生成).但是,每当我设置自定义时,它都会在我使用自定义构建时被覆盖.
void Main()
{
var fixture = new Fixture();
fixture.Customize<Person>(composer => composer.With(p => p.Name, "Ben"));
var person = fixture.Build<Person>()
.With(p => p.DateOfBirth, new DateTime(1900, 1, 1))
.Create();
/* RESULT OF person below
Name null
DateOfBirth 1/1/1900
StreetAddress StreetAddressafd6b86b-376a-4355-9a9c-fbae34731453
State State019e867b-ac5e-418f-805b-a64146bc06bc
*/
}
public class Person
{
public string Name { get; set;}
public DateTime DateOfBirth { get; set;}
public string StreetAddress { get; set;}
public string State { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
"Name"和"DateOfBirth"属性自定义不会发生冲突,因此我不知道为什么Name最终为null.我希望名字是"本".
如何获得它以便应用两种自定义(即Name ="Ben"和DateOfBirth = 1/1/1900?
我负责管理自动化构建,最近我们将两个基于Silverlight的Web应用程序转移到同一个解决方案中.现在大约有一半的时间我们通过构建服务器进行构建时,构建会随着两个xap文件之一随机失败,并显示以下错误消息.
Xap包装失败了.该进程无法访问文件 ' G:\ Builds\2\Application Suite\Main\Binaries\silverlight app1.xap ', 因为它正由另一个进程使用.
结构如下:
web app1 BUILDS silverlight app1
web app2建立了silverlight app2
有人可以帮我解决这个问题,这让我很头疼吗?
您好,我是Windows手机开发的新手,我正在尝试构建一个数据驱动的应用程序,其中我创建了我的BLL和EL和DAL,这些都是Windows手机类库类型项目.我在我的解决方案中还有一个类型类库的额外项目,其中我添加了对"MyGeneration.dOOdads.dll"文件的引用.现在我希望在Windows phone app项目中引用这个项目.但是当我尝试添加引用时,VS 2010说...... "无法添加所选项目引用.项目引用必须是另一个银灯windows phone项目是相同还是较低版本"....请帮助我在这种情况下.谢谢
我正在创建一个使用durandal和knockout的个人网站,并使用以下代码绑定编辑博客页面.一切都很好,我能够将文本区域与ajax调用的返回文本绑定.
一旦完成这一点,我很好奇,如果Web服务的长响应会破坏它,所以我在服务中放入一个Thread.Sleep(1000),现在我无法将它返回到文本区域.有关如何使其工作的任何建议???
旁注:我不认为这与durandal框架有关,但我认为我会包括我是它
JavaScript的
define(['services/logger', 'services/wysiwyg'], function (logger, wysiwyg) {
var postObservable = ko.mapping.fromJS({});
var vm = {
activate: activate,
post: postObservable,
};
return vm;
function activate(routeData) {
var id = routeData.id;
$.ajax(
{
type: "GET",
url: '/api/blog/get',
data: { id: id },
dataType: "json",
})
.then(function(data){
ko.mapping.fromJS(data, postObservable);
});
}
});
Run Code Online (Sandbox Code Playgroud)
C#
public class BlogController : ApiController
{
public IBlogRepository _blogRepository;
public BlogController(IBlogRepository blogRepository)
{
_blogRepository = blogRepository;
}
public BlogModel get(int id)
{
//Thread.Sleep(1000); <-- breaks …
Run Code Online (Sandbox Code Playgroud) knockout-mapping-plugin asp.net-web-api knockout.js durandal
c# ×3
.net ×2
autofixture ×1
durandal ×1
knockout.js ×1
linq ×1
sql-server ×1
tfs2012 ×1
tfsbuild ×1
unit-testing ×1
winapi ×1
windows ×1
xap ×1