有没有办法通过查看先前传递的参数来缓存 LINQ to SQL 查询并一起绕过数据库?
我知道 L2S 缓存了一些数据库调用,但我正在寻找一个永久的解决方案,即使应用程序重新启动,缓存也会重新加载,并且不再询问数据库。
有没有适合C#的框架?
我需要一种方法来遍历 LINQ-to-SQL 表达式树以提取查询中的表名称。即使只是查询中使用的第一个表可能就足够了。
例子:
var query = from c in Db.Customers select c;
Run Code Online (Sandbox Code Playgroud)
以及理想的函数:
string TableName = ExtractTablesFromQuery(query);
Run Code Online (Sandbox Code Playgroud)
将返回字符串“Customers”
我有一张桌子,如下所示:
prefix | value
ABC 1234
ABC 5678
DEF 1234
Run Code Online (Sandbox Code Playgroud)
是否可以创建一个 linq 查询,其中前缀和值连接起来以便在 where 子句中进行比较?我已经尝试过这个,但它总是返回一个空集:
selected =
from i in dc.items
where i.prefix + i.value == "ABC1234"
select i;
Run Code Online (Sandbox Code Playgroud)
编辑:以下 T-SQL 得出正确的结果:
WHERE LTRIM(RTRIM([prefix])) + LTRIM(RTRIM([value])) = 'ABC1234'
Run Code Online (Sandbox Code Playgroud)
Edit2:以下内容结合了下面的大部分答案,仍然不起作用:
where (String.Concat(i.prefix.Trim(), i.value.Trim())) == "ABC1234"
Run Code Online (Sandbox Code Playgroud)
Edit3:所以我已经让它工作了,但我不知道为什么。我已经接受了答案,但如果有人发布为什么它有效,我将不胜感激:)
这有效(返回 n 行):
var temp = dc.items.Where(i => i.prefix.Trim() + i.prefix.Trim() == "ABC1234");
Run Code Online (Sandbox Code Playgroud)
这不起作用(返回 0 行):
var temp =
from i in dc.items
where i.prefix.Trim() + i.value.Trim() == "ABC1234"
select i;
Run Code Online (Sandbox Code Playgroud) 我正在尝试对 Linq 到实体进行单元测试,我想在不同的大小写中搜索相同的单词并返回相同的单词。
当前的情况是我正在尝试对小写和大写单词进行单元测试,例如“Hi”和“hi”。
使用实体框架的 Linq to 实体当前支持此功能,我可以在 where 子句中搜索这两个术语,它为我工作。
问题:我正在尝试制作一个行为相同的模拟可查询:
public class SimpleWord
{
public string Text;
}
[Test]
public void someTest()
{
//arrange
var lowerWords = new[] { "hi" };
var upperWords = new[] { "Hi" };
var wordsList = new List<SimpleWord> {new SimpleWord { Text = "hi" } };
IDbSet<SimpleWord> wordsDbSet = Substitute.For<DbSet<SimpleWord>, IDbSet<SimpleWord>>();
//set up the mock dbSet
var dataAsList = wordsList.ToList();
var queryable = dataAsList.AsQueryable();
wordsDbSet.Provider.Returns(queryable.Provider);
wordsDbSet.Expression.Returns(queryable.Expression);
wordsDbSet.ElementType.Returns(queryable.ElementType);
wordsDbSet.GetEnumerator().Returns(queryable.GetEnumerator());
//act
var resultLower = wordsDbSet.Where(wrd …Run Code Online (Sandbox Code Playgroud) 使用 Entity Framework Core 3.1 对 SQL Server 2012 数据库进行以下查询:
var tows = await _context.DataEntryTow
.Where(t => _context.DataEntrySample
.Any(s => s.TowId==t.TowId && (s.MicroscopeId != "0" || s.MicroscopeId == null)))
.Select (t => new { text = t.TowId, value = t.TowId });
Run Code Online (Sandbox Code Playgroud)
生成此 SQL:
SELECT d.tow_id AS text
FROM data_entry_tow AS d
WHERE EXISTS (
SELECT 1
FROM data_entry_sample AS d0
WHERE (d0.tow_id = d.tow_id) AND (((d0.microscope_id <> '0') OR (d0.microscope_id IS NULL)) OR (d0.microscope_id IS NULL)))
Run Code Online (Sandbox Code Playgroud)
我不认为我做错了什么,而且我相当确定查询优化器会消除第二个(d0.microscope_id …
我看过很多类似的问题,但没有一个能给我解决方案,所以我想是否有人可以帮助我解决这个问题。我有一个实体层次结构,因为客户有多个 ClientRateDeals,然后我尝试仅获取那些具有全部通过某些条件的客户费率交易列表的客户。这是我生成错误的 LINQ 查询:
var query = _context.Client.Where(c=>c.Disabled==false)
.GroupJoin(_context.ClientRateDeal.Where(crd=>crd.Disabled==false),
c => c.Id,
crd => crd.ClientId,
(c, crd) => new
{
c,
crd = crd.Where(cr => cr.DateEnd == null || cr.DateEnd > DateTime.Today)
})
.Where(res => res.crd.Count() == 0)
.Select(cl => cl.c).AsNoTracking().ToList();
Run Code Online (Sandbox Code Playgroud)
正如您在结果选择器参数中看到的,我保留了该条件,然后在结果选择器上保留了 where 子句,以仅获取那些客户端速率交易计数为 0 的内容。但是,由于某种原因,我收到了 LINQ 无法执行的异常被翻译。谁能帮我这个 ?
我正准备开始一个新的asp.net web项目,我将转向LINQ-to-SQL.我已经完成了一些工作,使用Mike Hadlow发现的一些信息来设置我的数据层,这些信息使用Interface和泛型为数据库中的每个表创建一个Repository.起初我认为这是一个有趣的方法.但是,现在我认为创建一个基本Repository类并继承它以为我需要访问的表创建一个TableNameRepository类可能更有意义.
哪种方法允许我以干净的可测试方式添加特定于表的功能?这是我的Repository实现以供参考.
public class Repository<T> : IRepository<T> where T : class, new()
{
protected IDataConnection _dcnf;
public Repository()
{
_dcnf = new DataConnectionFactory() as IDataConnection;
}
// Constructor injection for dependency on DataContext
// to actually connect to a database
public Repository(IDataConnection dc)
{
_dcnf = dc;
}
/// <summary>
/// Return all instances of type T.
/// </summary>
/// <returns>IEnumerable<T></returns>
public virtual IEnumerable<T> GetAll()
{
return GetTable;
}
public virtual T GetById(int id)
{
var …Run Code Online (Sandbox Code Playgroud) 我有这样的代码:
var newMsg = new Msg
{
Var1 = var1,
Var2 = var2
};
using (AppDataContext appDataContext = new AppDataContext(ConnectionString))
{
appDataContext.CClass.InsertOnSubmit(newMsg);
appDataContext.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
阅读这篇文章后,我相信同样的逻辑适用.
有谁认为这是受SQL注入攻击?
我正在尝试使用LINQ,特别是LINQ to SQL,但我遇到了一些困难
我已经尝试使用SqlMetal,现在在Visual Studio中使用数据库表设计器,并且我使用我在VS2008中使用数据库布局设计器创建的数据上下文,在此代码中不断收到类似的错误.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
string usn = UserNameBox.Text;
string pss = PassBox.Text;
if (usn == "" || pss == "")
return;
DataClassesDataContext dc = new DataClassesDataContext();
var user = from u in User
where u.UserName == usn
select u;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在哪里说错了:找不到源类型'System.Security.Principal.IPrincipal'的查询模式的实现.还有:'哪里'找不到.
当我尝试使用SqlMetal的结果时,我有类似的东西.我删除了该源并开始使用设计器.我必须在这里遗漏一些东西,但我无法弄清楚是什么.我不应该实现我需要的表,因为我使用LINQ to SQL,或者我是否需要做一些额外的事情才能实现这一点?
我一直在玩Linq to Sql,我想知道是否有可能得到一个结果?例如,我有以下内容:
using(DataClassContext context = new DataClassContext())
{
var customer = from c in context.table
其中c.ID = textboxvalue
select c;
}
有了这个我需要围绕var客户做一个foreach,但我知道这将是一个单一的价值!任何人都知道如何做"textbox.text = c.name;" 或者那条线上的东西......
linq-to-sql ×10
c# ×7
linq ×5
.net ×1
.net-core ×1
asp.net ×1
caching ×1
nsubstitute ×1
sql-server ×1